// typedef的使用及样例
#include <iostream>
#include <vector>

 // 1. 基本类型的别名 
typedef int myint;

// 2. 指针的别名
typedef int* IntPtr;

// 3. 引用的别名
typedef int& IntRef;

// 4. 结构体的别名
typedef struct MyStruct
{
    int a;
    int b;
}StructAlias;

// 5. 函数指针的别名
typedef void (*FuncPtr) (int, int);
void myFuction(int a, int b)
{
    std::cout << "5.函数指针的别名 myFunction a: " << a << ", b: " << b << std::endl;
}

// 6. 模板的别名
template <class T>
using Vec = std::vector <T>;

int main()
{
    std::cout << "-- typedef 的样例 --" << std::endl;
    myint a = 1; std::cout << "1.基本类型的别名 myint a: " << a << ", 地址: " << &a << std::endl;
    IntPtr p = &a; std::cout << "2.指针的别名 IntPtr p: " << *p << ", 地址: " << p << ", p地址: " << &p << std::endl;
    IntRef r = a; std::cout << "3.引用的别名 IntRef r: " << r << ", 地址: " << &r << std::endl;
    StructAlias s = { 1, 2 }; std::cout << "4.结构体的别名 StructAlias s: " << s.a << ", " << s.b << std::endl;
    FuncPtr func = myFuction; func(1, 2);
    {   // 函数指针的别名
        typedef int (*FuncIntPtr)(int, int);
        FuncIntPtr func = [](int a, int b) -> int { return a + b; }; // lambda表达式
        std::cout << "FuncIntPtr func: " << func(1, 2) << std::endl;
    }
    std::cout << "6.模板的别名" << std::endl;
    Vec<int> v;
    for (int i = 0; i < 3; i++)v.push_back(i);
    for (auto i : v)
        std::cout << "Vec<int> v: " << i << std::endl;
    std::cout << "--------" << std::endl;
    return 0;
}